/*
 * ListaActividadesPorProceso.java
 *
 * Created on Sep 22, 2008, 6:50:40 PM
 */
package wasolicitudesfiec.general;

import com.sun.rave.web.ui.component.Hyperlink;
import web.util.Constantes;
import com.sun.rave.web.ui.appbase.AbstractPageBean;
import com.sun.rave.web.ui.component.Label;
import entidad.Usuario;
import entidad.apertura.Solicitudaperturapostgrado;
import entidad.ayudantias.Solicitudayudantia;
import entidad.ayudantias.Solicitudserayudante;
import entidad.cambioCarrera.Solicitudcambiocarrera;
import entidad.convalidacionMateria.Solicitudconvalidacionmateria;
import hero.interfaces.BnNodeValue;
import hero.interfaces.ProjectSession;
import hero.interfaces.UserSession;
import hero.util.HeroException;
import java.rmi.RemoteException;
import java.util.Collection;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.FacesException;
import javax.faces.application.FacesMessage;
import javax.faces.convert.DateTimeConverter;
import wasolicitudesfiec.ApplicationBean1;
import wasolicitudesfiec.Menu;
import wasolicitudesfiec.SessionBean1;
import wasolicitudesfiec.RequestBean1;
import wasolicitudesfiec.authentication.AuthenticationPhaseListener;
import wasolicitudesfiec.general.Dp_ProcesosEnCurso;
import wasolicitudesfiec.logicacontrol.*;
import wasolicitudesfiec.plantillas.PanelIzquierdo;
import wasolicitudesfiec.registros.Rg_Solicitud;

/**
 * <p>Page bean that corresponds to a similarly named JSP page.  This
 * class contains component definitions (and initialization code) for
 * all components that you have defined on this page, as well as
 * lifecycle methods and event handlers where you may add behavior
 * to respond to incoming events.</p>
 *
 * @author kabad
 */
public class ListaActividadesPorProceso extends AbstractPageBean {

    private Logica logica;
    private LogicaHistorial logicaHistorial;
    private Dp_ProcesosEnCurso dp_ProcesosEnCurso = new Dp_ProcesosEnCurso();
    private ProjectSession prjSession;
    private UserSession usrSession;

    // <editor-fold defaultstate="collapsed" desc="Managed Component Definition">
    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() throws Exception {
        dateTimeConverter1.setTimeZone(java.util.TimeZone.getTimeZone("America/Guayaquil"));
        dateTimeConverter1.setLocale(new java.util.Locale("es", "EC", ""));
        dateTimeConverter1.setPattern("dd/MM/yyyy H:mm");
        dateTimeConverter1.setTimeStyle("full");
        dateTimeConverter1.setType("both");
    }
    private DateTimeConverter dateTimeConverter1 = new DateTimeConverter();

    public DateTimeConverter getDateTimeConverter1() {
        return dateTimeConverter1;
    }

    public void setDateTimeConverter1(DateTimeConverter dtc) {
        this.dateTimeConverter1 = dtc;
    }
    private Label lblTitulo = new Label();

    public Label getLblTitulo() {
        return lblTitulo;
    }

    public void setLblTitulo(Label l) {
        this.lblTitulo = l;
    }
    private Label lblSolicitante = new Label();

    public Label getLblSolicitante() {
        return lblSolicitante;
    }

    public void setLblSolicitante(Label l) {
        this.lblSolicitante = l;
    }
    private Label lblFechaCreacion = new Label();

    public Label getLblFechaCreacion() {
        return lblFechaCreacion;
    }

    public void setLblFechaCreacion(Label l) {
        this.lblFechaCreacion = l;
    }
    private Label lblFechaFin = new Label();

    public Label getLblFechaFin() {
        return lblFechaFin;
    }

    public void setLblFechaFin(Label l) {
        this.lblFechaFin = l;
    }
    private Label lblEstado = new Label();

    public Label getLblEstado() {
        return lblEstado;
    }

    public void setLblEstado(Label l) {
        this.lblEstado = l;
    }
    private Hyperlink hyperlink1_btn = new Hyperlink();

    public Hyperlink getHyperlink1_btn() {
        return hyperlink1_btn;
    }

    public void setHyperlink1_btn(Hyperlink h) {
        this.hyperlink1_btn = h;
    }
    private Label lblActividadPendiente = new Label();

    public Label getLblActividadPendiente() {
        return lblActividadPendiente;
    }

    public void setLblActividadPendiente(Label l) {
        this.lblActividadPendiente = l;
    }

   
    private Hyperlink linkactividad = new Hyperlink();

    public Hyperlink getLinkactividad() {
        return linkactividad;
    }

    public void setLinkactividad(Hyperlink h) {
        this.linkactividad = h;
    }
    private Hyperlink linkactividadPendiente = new Hyperlink();

    public Hyperlink getLinkactividadPendiente() {
        return linkactividadPendiente;
    }

    public void setLinkactividadPendiente(Hyperlink h) {
        this.linkactividadPendiente = h;
    }

    // </editor-fold>
    /**
     * <p>Construct a new Page bean instance.</p>
     */
    public ListaActividadesPorProceso() {
        String instancia = (String) this.getExternalContext().getRequestParameterMap().get("instancia");
        String tipoHistorial = (String) this.getExternalContext().getRequestParameterMap().get("comando");
        if ((instancia != null) && (tipoHistorial != null)) {
            this.getExternalContext().getSessionMap().put("instancia", instancia);
            this.getExternalContext().getSessionMap().put("comando", tipoHistorial);
        }
    }

    public Vector<Rg_Solicitud> agregarActividadActual(Vector<Rg_Solicitud> listaRgActividades, String modelo, String nombreInstancia, String profesorEnSolicitudSerAyudante) throws Exception {
        prjSession = logica.getProjectSession();
        usrSession = logica.getUserSession();
        Usuario usuario = (Usuario) getSessionMap().get(AuthenticationPhaseListener.USER_SESSION_KEY);
        BnNodeValue actividad;
        Rg_Solicitud rg_actividadPendiente;
        inicializarInstancia(nombreInstancia);
        Collection actividades = prjSession.getNodesNames();
        boolean isActividadInformePostgrado;
String nombreActividad="";
        for (Object elem : actividades) {
            int state = prjSession.getNodeState((String) elem);
            nombreActividad =(String) elem;
            // en este caso estoy tomando la primera actividad en estado ready que encuentre
            if (state == 1 && (!nombreActividad.equals(Constantes.SolicitarAyudantes.registroEstudiantes) ||
                    !nombreActividad.equals(Constantes.SolicitarAyudantes.esperarConfirmacion))) {
                String rolEjecutor = "", usuarioEjecutor = "", nombreEjecutor = "";
                rg_actividadPendiente = new Rg_Solicitud();
                actividad = usrSession.getNode(nombreInstancia, (String) elem);
                rg_actividadPendiente.setDescripcion(actividad.getDescription());
                rg_actividadPendiente.setAccion("(Actividad actual)");
                rg_actividadPendiente.setNombreinstanciaproceso(nombreInstancia);
                rg_actividadPendiente.setActividadPendiente(actividad.getName());
                rolEjecutor = actividad.getBnRole().getName();
                isActividadInformePostgrado = Constantes.SolicitarAperturaPostgrado.emitirInformeEvaluador1.equals(actividad.getName()) ||
                        Constantes.SolicitarAperturaPostgrado.emitirInformeEvaluador2.equals(actividad.getName()) ||
                        Constantes.SolicitarAperturaPostgrado.emitirInformeEvaluador3.equals(actividad.getName());

                if (Constantes.SolicitarCambio.emitirInforme.equals(actividad.getName()) ||
                        Constantes.SolicitarConvalidacion.emitirInforme.equals(actividad.getName()) ||
                        isActividadInformePostgrado) {
                    usuarioEjecutor = actividad.getActivityPerformer();
                    nombreEjecutor = logica.leerPersonaPorUsuario(usuarioEjecutor).toString();
                } else if (!rolEjecutor.equals("comodin")) {
                    for (Object object : prjSession.getUsersRole(actividad.getBnRole().getName())) {
                        usuarioEjecutor = (String) object;
                        nombreEjecutor = logica.leerPersonaPorUsuario(usuarioEjecutor).toString();
                    }
                } else if (rolEjecutor.equals("comodin")) {
                    //si es comodin preguntamos si pertenece a los modelos donde existe este usuario y lo mapeamos al correspondiente rol y usuario.
                    if (modelo.equals(Constantes.Modelo.modelo_SolicitarAyudantes)) {
                        rolEjecutor = "Sistema";
                        nombreEjecutor="";

                    }
                    if (modelo.equals(Constantes.Modelo.modelo_SolicitarSerAyudante)) {
                        rolEjecutor = "Profesor";
                        nombreEjecutor = profesorEnSolicitudSerAyudante;
                    }
                }
                if (usuarioEjecutor.equals(usuario.getUsuario()) && !isActividadInformePostgrado
                       ) {
                    this.getLinkactividadPendiente().setRendered(true);
                    this.getLblActividadPendiente().setRendered(false);
                   } else {
                    this.getLinkactividadPendiente().setRendered(false);
                    this.getLblActividadPendiente().setRendered(true);
                 }
                rg_actividadPendiente.setEjecutor(nombreEjecutor);
                rg_actividadPendiente.setRolEjecutor(rolEjecutor);
                listaRgActividades.add(rg_actividadPendiente);

            }
        }
        return listaRgActividades;
    }

    @Override
    public void init() {
        // Perform initializations inherited from our superclass
        super.init();
        try {
            _init();
        } catch (Exception e) {
            log("ListaActividadesPorProceso Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
        }

        Solicitudayudantia solicitudAyudantia = null;
        Solicitudserayudante solicitudserayudante = null;
        Solicitudcambiocarrera solicitudcambiocarrera = null;
        Solicitudconvalidacionmateria solicitudconvalidacionmateria = null;
//        Solicitudaperturatopico solicitudaperturatopico = null;
        Solicitudaperturapostgrado solicitudaperturapostgrado = null;
        FacesMessage message;
        String solicitante = "";
        Rg_Solicitud rg_solicitud = null;
        Vector<Rg_Solicitud> listaRgActividades = new Vector<Rg_Solicitud>();
        logica = new Logica();
        logicaHistorial = new LogicaHistorial();

        try {
            String nombreInstancia = (String) this.getExternalContext().getSessionMap().get("instancia");
            int indiceModelo = nombreInstancia.indexOf("_");
            String modelo = nombreInstancia.substring(0, indiceModelo);
            int indice = nombreInstancia.lastIndexOf("e");
            int idInstancia = new Integer(nombreInstancia.substring(indice + 1, nombreInstancia.length()));
            int idSolicitud = new Integer(logicaHistorial.leerPropiedadporProceso(idInstancia, Constantes.Atributo.idSolicitudProceso));
            getMenu().setTitulo(modelo + "_" + idSolicitud + ": Actividades Realizadas");
            String profesorSolicitarAyudantes = "";

            if (Constantes.Modelo.modelo_SolicitarAyudantes.equals(modelo)) {
                solicitudAyudantia = logica.getLogAyudantia().leerSolicitudayudantiaNivel2(idSolicitud);
                rg_solicitud = solicitudAyudantia;
                solicitante = solicitudAyudantia.getProfesor().getPersona().toString();
                listaRgActividades = this.logicaHistorial.leerActividadesSolicitarAyudantes(nombreInstancia);
            }
            if (Constantes.Modelo.modelo_SolicitarSerAyudante.equals(modelo)) {
                solicitudserayudante = logica.getLogAyudantia().leerSolicitudserayudanteNivel2(idSolicitud);
                profesorSolicitarAyudantes = solicitudserayudante.getSolicitudayudantia().getProfesor().getPersona().toString();
                rg_solicitud = solicitudserayudante;
                solicitante = solicitudserayudante.getEstudiante().getPersona().toString();
                listaRgActividades = this.logicaHistorial.leerActividadesSolicitarSerAyudantes(nombreInstancia);
            }
            if (Constantes.Modelo.modelo_SolicitarCambioCarrera.equals(modelo)) {
                solicitudcambiocarrera = logica.getLogCambioCarrera().leerSolicitudCambioNivel2(idSolicitud);
                rg_solicitud = solicitudcambiocarrera;
                solicitante = solicitudcambiocarrera.getEstudiante().getPersona().toString();
                listaRgActividades = this.logicaHistorial.leerActividadesSolicitarCambio(nombreInstancia);
            }
            if (Constantes.Modelo.modelo_SolicitarConvalidacionMateria.equals(modelo)) {
                solicitudconvalidacionmateria = logica.getLogConvalidacionMateria().leerSolicitudConvalidacionNivel2(idSolicitud);
                rg_solicitud = solicitudconvalidacionmateria;
                solicitante = solicitudconvalidacionmateria.getEstudiante().getPersona().toString();
                listaRgActividades = this.logicaHistorial.leerActividadesSolicitarConvalidacion(nombreInstancia);
            }

//            if (Constantes.Modelo.modelo_SolicitarAperturaTopico.equals(modelo)) {
//                 solicitudaperturatopico = logica.getLogAperturaTopico().leerSolicitudAperturaNivel2(idSolicitud);
//                rg_solicitud = solicitudaperturatopico;
//                solicitante = solicitudaperturatopico.getProfesor().getPersona().toString();
//               listaRgActividades = this.logicaHistorial.leerActividadesSolicitarAperturaTopico(nombreInstancia);
//            }
            if (Constantes.Modelo.modelo_SolicitarAperturaPostgrado.equals(modelo)) {
                solicitudaperturapostgrado = logica.getLogAperturaPostgrado().leerSolicitudAperturaNivel2(idSolicitud);
                rg_solicitud = solicitudaperturapostgrado;
                solicitante = solicitudaperturapostgrado.getProfesor().getPersona().toString();
                listaRgActividades = this.logicaHistorial.leerActividadesSolicitarAperturaPostgrado(nombreInstancia);
            }
            String tipoHistorial = (String) this.getExternalContext().getSessionMap().get("comando");
            if (tipoHistorial.equals("procesosEnCurso")) {
                agregarActividadActual(listaRgActividades, modelo, nombreInstancia, profesorSolicitarAyudantes);
            }
           
            this.getLblSolicitante().setText(solicitante);
            this.getLblTitulo().setText(rg_solicitud.toString());
            this.getLblFechaCreacion().setText(rg_solicitud.getFechacreacion());
            if (rg_solicitud.getEstado().equals(Constantes.EstadoSolicitud.Activa.toString())) {
                this.getLblFechaFin().setText("No disponible");
            } else {
                this.getLblFechaFin().setText(rg_solicitud.getFechamodificacion());
            }
            this.getLblEstado().setText(rg_solicitud.getEstado());
        } catch (Exception ex) {
            Logger.getLogger(ListaActividadesPorProceso.class.getName()).log(Level.SEVERE, null, ex);
            message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ocurrió un error no esperado, comuníquese con el adminsitrador del sistema", ex.getLocalizedMessage());
            getFacesContext().addMessage(null, message);
        }
        this.getDp_ProcesosEnCurso().setListaRgSolicitudes(listaRgActividades);



    }

    public void inicializarInstancia(String nombreInstancia) throws HeroException, RemoteException, Exception {
        if ((usrSession == null)) {
            throw new Exception("UserSession no pudo ser inicializado");
        }
        if ((prjSession == null)) {
            throw new Exception("ProjectSession no pudo ser inicializado");
        }
        if (nombreInstancia == null) {
            throw new Exception("El nombre de la instancia no fue especificado");
        }
        usrSession.getModelInstancesTodoList(nombreInstancia);
        prjSession.initProject(nombreInstancia);
    }

    /**
     * <p>Callback method that is called after the component tree has been
     * restored, but before any event processing takes place.  This method
     * will <strong>only</strong> be called on a postback request that
     * is processing a form submit.  Customize this method to allocate
     * resources that will be required in your event handlers.</p>
     */
    @Override
    public void preprocess() {
    }

    /**
     * <p>Callback method that is called just before rendering takes place.
     * This method will <strong>only</strong> be called for the page that
     * will actually be rendered (and not, for example, on a page that
     * handled a postback and then navigated to a different page).  Customize
     * this method to allocate resources that will be required for rendering
     * this page.</p>
     */
    @Override
    public void prerender() {
        if (getPanelIzquierdo() != null) {
            getPanelIzquierdo().miPrerender();
        }
    }

    /**
     * <p>Callback method that is called after rendering is completed for
     * this request, if <code>init()</code> was called (regardless of whether
     * or not this was the page that was actually rendered).  Customize this
     * method to release resources acquired in the <code>init()</code>,
     * <code>preprocess()</code>, or <code>prerender()</code> methods (or
     * acquired during execution of an event handler).</p>
     */
    @Override
    public void destroy() {
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected ApplicationBean1 getApplicationBean1() {
        return (ApplicationBean1) getBean("ApplicationBean1");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected SessionBean1 getSessionBean1() {
        return (SessionBean1) getBean("SessionBean1");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected RequestBean1 getRequestBean1() {
        return (RequestBean1) getBean("RequestBean1");
    }

    public Menu getMenu() {
        return (Menu) getBean("SolicitudesFIEC$Menu");
    }

    protected PanelIzquierdo getPanelIzquierdo() {
        return (PanelIzquierdo) getBean("plantillas$PanelIzquierdo");
    }

    public Dp_ProcesosEnCurso getDp_ProcesosEnCurso() {
        return dp_ProcesosEnCurso;
    }

    public void setDp_ProcesosEnCurso(Dp_ProcesosEnCurso dp_ProcesosEnCurso) {
        this.dp_ProcesosEnCurso = dp_ProcesosEnCurso;
    }

    public String hyperlink1_btn_action() {
        // TODO: Replace with your code
        return null;
    }
}

